![]() |
![]() |
|
Alle drei Ereignisse sind vom Typ MouseEventHandler und übergeben dem Ereignishandler im zweiten Parameter ein Objekt vom Typ MouseEventArgs, dessen Eigenschaften wir uns nun ansehen wollen.
Da die Mausereignisse unabhängig davon, welche Maustaste der Anwender gedrückt hat, ausgelöst werden, ist die Auswertung der Maustaste sehr wichtig. Die Eigenschaft Button liefert uns die gewünschte Information, die durch die Werte der Enumeration MouseButtons beschrieben werden.
Während sich für die ersten vier Enumerationskonstanten eine weitergehende Erläuterung erübrigt, muss zu den letzten beiden XButton1 und XButton2 gesagt werden, dass sie sich auf die Tasten der IntelliMouse Explorer beziehen, die über fünf Tasten verfügt. Die Auswertung der gedrückten Maustaste ist denkbar einfach. Im Ereignishandler, der mit dem Mausereignis verknüpft ist, wird die Eigenschaft Button des Parameters vom Typ MouseEventArgs abgefragt und darauf entsprechend reagiert:
Die Enumeration MouseButtons ist mit dem Flags-Attribut verknüpft, folglich können die Werte auch bitweise miteinander kombiniert werden, um festzustellen, ob der Anwender mehrere Tasten gleichzeitig gedrückt hat. Inwiefern das eine praktische Bedeutung hat, sei an dieser Stelle nicht weiter diskutiert. Sollten Sie als Linkshänder in der Systemsteuerung von Windows die linke und rechte Maustaste vertauscht haben, wird Ihnen bei der Auswertung von MouseButtons trotz des Drückens der rechten Maustaste Left zurückgegeben. Sinnvoller wäre es daher gewesen, zwischen einer primären und einer sekundären Maustaste zu unterscheiden und dabei die primäre mit der gleichzusetzen, mit der standardmäßig das Click-Ereignis ausgelöst wird. Die MouseEventsArgs-Eigenschaft Clicks liefert nur die Zahlen 1 oder 2. Damit lässt sich feststellen, ob es sich um einen einfachen oder einen Doppelklick des Anwenders gehandelt hat.
Die Eigenschaften X und Y enthalten die aktuellen Koordinaten des Mauscursors, Location liefert beide Werte gleichzeitig über ein Point-Objekt. Die Werte in Pixel beziehen sich immer auf das Steuerelement oder die Form, über deren Bereich sich der Mauszeiger befindet. Dabei ist der Nullpunkt immer die linke obere Ecke der Komponente, die das Mausereignis ausgelöst hat. Im folgenden Beispiel MouseMoveDemo wird in einer PictureBox an der aktuellen Mauszeigerposition ein Fadenkreuz aus einer vertikalen und einer horizontalen Linie gezeichnet, die jeweils von einem Rand bis zum gegenüberliegenden reicht.
Abbildung 20.1 Ausgabe des Beispiels »MouseMoveDemo«
Das Fadenkreuz wird gezeichnet, sobald die Maus in den Clientbereich der Picturebox eintritt. Die Koordinaten des Mauszeigers werden in je einer Textbox ausgegeben. Damit die Picturebox beim Ziehen der Maus nur das aktuelle Fadenkreuz anzeigt, muss zuerst das ungültige gewordene Fadenkreuz gelöscht werden. Dazu ist auf Klassenebene das Feld MousePoint deklariert, das immer die Mauskoordinaten enthält, mit denen das letzte Fadenkreuz gezeichnet worden ist. Mit diesen Punktkoordinaten wird zuerst ein Fadenkreuz in der Hintergrundfarbe der Picturebox gezeichnet. Das ungültig gewordene Fadenkreuz ist damit »gelöscht«. Die aktuellen Mauskoordinaten werden anschließend in das Feld MousePoint geschrieben und das neue Fadenkreuz in weißer Farbe gezeichnet. Das Zeichnen eines Fadenkreuzes übernimmt die Methode DrawLines der Form, die aus dem MouseMove-Ereignis heraus sowohl für das zu löschende als auch das neu zu zeichnende Fadenkreuz aufgerufen wird. Zum Zeichnen bedienen wir uns einer Methode der Graphics-Klasse: DrawLine, der wir als erstes Argument ein Pen-Objekt übergeben, das die Farbe des Fadenkreuzes beschreibt. Je zwei Point-Objekte legen den Start- und den Endpunkt jeder Linie fest. 20.2.2 Das Ereignis »MouseWheel«
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| textBox1.MouseWheel += new MouseEventHandler(MouseWheelHandler); |
Danach kann in bekannter Weise der Ereignishandler implementiert werden:
| private void MouseWheelHandler(object sender, MouseEventArgs e) { |
| // Anweisungen |
| } |
Zur Steuerung des Bildlaufs dient die Eigenschaft Delta des MouseEventArgs-Objekts. Beträgt der Wert 120, entspricht das einem Bildlauf. Der Wert 120 wird dabei den Tiefen der Win32-API entnommen Auf die Maus übertragen entspricht das dem Weiterdrehen des Mausrades um ein Raster. Die Richtung der Drehung spiegelt sich im Vorzeichen von Delta wider.
Die Frage, um wie viele Zeilen der Bildlauf bei der Drehung des Mausrades um 120 Einheiten erfolgt, kann der Eigenschaft SystemInformation.MouseWheelScrollLines entnommen werden. Der Standard ist auf 3 festgelegt.
Mit den folgenden drei Mausereignissen lassen sich auch spezielle Anwendungsfälle erfassen:
| MouseEnter wird ausgelöst, wenn der Mauszeiger in den Bereich der Komponente eindringt. |
| MouseHover tritt auf, wenn der Mauszeiger im Clientbereich der Komponente einen Augenblick lang bewegungslos verharrt. Wird der Mauszeiger kontinuierlich bewegt, wird das Ereignis nicht ausgelöst. |
| MouseLeave ist das Gegenstück zu MouseEnter. Es wird ausgelöst, wenn der Mauszeiger den Clientbereich der Komponente verlässt. |
Alle drei Ereignisse sind vom Typ EventHandler und stellen dem Ereignishandler somit auch keine weiteren Informationen zur Verfügung, denn das Objekt EventArgs enthält bekanntlich keine spezifischen Eigenschaften.
Die Ereignisse Click und DoubleClick sowie die analogen MouseClick und MouseDoubleClick sind an die primäre Maustaste gebunden. Standardmäßig ist das die linke. Nur wenn ein Linkshänder in der Systemsteuerung eine andere Vorgabe gewählt hat, handelt es sich um die rechte. Das Click-Ereignis tritt nach dem Ereignis MouseDown, aber noch vor MouseUp auf. Ein Doppelklick wird dann erkannt, wenn innerhalb einer bestimmten Zeitspanne kurz hintereinander auf die primäre Maustaste gedrückt wird.
Die Darstellung des Mauszeigers zur Laufzeit wird durch die in der Klasse Control definierte Eigenschaft Cursor festgelegt.
| public virtual Cursor Cursor {get; set;} |
Ausnahmsweise sind die vordefinierten Cursortypen nicht in einer Aufzählung, sondern in der Klasse Cursors enthalten. Der Mauscursor kann in Abhängigkeit von seiner Position verändert werden. Beispielsweise sollten Sie die Standardeinstellung Cursors.Default in die durch Cursors.WaitCursor beschriebene Sanduhr ändern, um den Anwender auf eine länger andauernde Operation hinzuweisen. Nach der Operation dürfen Sie nicht vergessen, den ursprünglichen Mauscursor wiederherzustellen:
| this.Cursor = Cursors.WaitCursor; |
| ... |
| this.Cursor = Cursors.Default; |
Sowohl das Formular als auch die Steuerelemente ermöglichen eine Anpassung des Cursors an die aktuellen Gegebenheiten. Stellen Sie diese Eigenschaft für die Form ein, gilt dies auch für die darin enthaltenen Steuerelemente, solange Sie diesen nicht ausdrücklich eine andere Einstellung zuweisen.
Die Klasse Cursor veröffentlicht eigene Eigenschaften und Methoden. Die interessanteste dürfte in diesem Zusammenhang die statische Eigenschaft Position sein, mit der die Position des Mauszeigers nicht nur abgerufen, sondern auch gesetzt werden kann:
| public static Point Position {get; set;} |
Die durch das Point-Objekt beschriebenen Koordinaten sind Bildschirmkoordinaten. Daher führt die Anweisung
| Cursor.Position = new Point(0, 0); |
dazu, dass der Mauszeiger in die obere linke Ecke des Bildschirms springt – auch wenn die neue Position außerhalb der aktuellen Form liegt.
Sehr ähnlich ist auch die statische Eigenschaft MousePosition der Klasse Control. Sie ist schreibgeschützt und liefert die Mausposition in Bildschirmkoordinaten, also bezogen auf den obersten linken Eckpunkt des Bildschirms:
| public static Point MousePosition {get;} |
Mit
| this.Text = Control.MousePosition.ToString(); |
kann man sich die Positionskoordinaten ausgeben lassen – in dieser Anweisung in der Titelleiste des Formulars. Interessant ist, dass die überschriebene Methode ToString dabei sofort eine lesbare Anzeige liefert und somit auch ein gutes Beispiel dafür ist, sich immer zu überlegen, ob diese von Object geerbte Methode sinnvoll überschrieben werden sollte.
MousePosition liefert immer Bildschirmkoordinaten zurück. Manchmal muss man diese in Clientkoordinaten umrechnen. Mit der Methode PointToClient, die in der Klasse Control definiert ist und sich an die aus dieser Klasse abgeleiteten Steuerelemente weitervererbt, können Sie das erreichen:
| public Point PointToClient(Point pt); |
Übergeben wird in diesem Fall der Inhalt der Eigenschaft MousePosition, z.B.:
| this.Text = this.PointToClient(Control.MousePosition).ToString(); |
Das zurückgegebene Point-Objekt kann sogar negative Werte enthalten. Folglich bietet sich PointToClient an, um den Abstand des Mauszeigers von einem beliebigen Steuerelement in Pixel zu ermitteln.
Manchmal möchte man, dass Mausaktionen nur dann ausgeführt werden, wenn eine oder mehrere der Zustandstasten (Strg), (Alt) und (Shift) gedrückt sind. Hier kann die statische Eigenschaft ModifierKeys, die schon weiter oben erwähnt wurde, sinnvoll eingesetzt werden.
Soll das im Beispiel MouseMoveDemo gezeichnete Fadenkreuz nur dann an der aktuellen Mausposition dargestellt werden, wenn gleichzeitig die (Alt)-Taste gedrückt ist, müssten wir den Ereignishandler des Ereignisses MouseMove wie folgt ergänzen:
| private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { |
| if(Control.ModifierKeys == Keys.Alt) { |
| txtX.Text = e.X.ToString(); |
| txtY.Text = e.Y.ToString(); |
| Graphics graph = pictureBox1.CreateGraphics(); |
| DrawLines(graph, MousePoint,pictureBox1.BackColor); |
| MousePoint = new Point(e.X, e.Y); |
| DrawLines(graph, MousePoint, Color.White); |
| graph.Dispose(); |
| } |
| } |
| << zurück |
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
|
||||||||||||||
Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.